//app.js
const apiService = require("./pages/utils/yxqzutil");
App({
  onLaunch: function () {
    /**
     * 初始化云函数环境
     */
    wx.cloud.init({
      env: 'tfjkp-0ge80vu9ea710148',
      traceUser: true, // 是否在将用户访问记录到用户管理中，在控制台中可见，默认为false
    })

    // 展示本地存储能力
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)

    // 生成随机昵称的方法
    function generateModernCulturalNickname() {
      const movementWords = [
        '步', '跑', '行', '走', '跃', '疾步', '冲刺', '飞步', '驰骋', '跨越',
        '腾飞', '奔跑', '疾驰', '逐梦', '快步', '劲风', '风行', '舞步', '飞驰',
        '纵横', '迅影', '疾风', '长跑', '追风', '飞翔', '踏步', '疾行', '脚步',
        '奔腾', '快跑', '腾跃', '追风', '冲锋', '飞跃', '火速', '逐光', '闪电'
      ];
      const culturalWords = [
        '风影', '流云', '竹影', '江湖', '山水', '飞瀑', '踏月', '书香', '青松',
        '兰溪', '沧浪', '飞鸿', '墨竹', '白云', '溪水', '临风', '云霄', '晨曦', '秋水', '晴川',
        '翠竹', '溪流', '翰墨', '云烟', '千山', '飞雪', '鸿鹄', '紫竹', '天涯', '古风',
        '墨香', '临江', '归隐', '山川', '白鹤', '青石', '万里', '大海', '明月', '流风',
        '桃源', '书院', '红尘', '如梦', '灵溪', '溪语', '梅花', '东风', '寒山', '长风',
        '落霞', '紫气', '流光', '暮云', '碧波', '松涛', '晨光', '天云', '醉月', '寒江'
      ];
      const movement = movementWords[Math.floor(Math.random() * movementWords.length)];
      const culture = culturalWords[Math.floor(Math.random() * culturalWords.length)];

      return `${culture}${movement}`; // 返回生成的随机昵称
    }

    /**
     * 使用全局回调的方式进行封装openid
     * 初始化openid、appid、unionid
     * 后续需要优化Openid，考虑加密等优化策略
     * 此处还需优化，异步请求会有空指针问题（网速波动以及首页渲染速度太快可复现）
     * 策略：添加引导页，添加同步锁，功能页面的请求做单独请求虽然性能太差，不过也可以解决
     */
    // 定义一个请求函数，用于获取用户信息
    function fetchUserInfo(openid, that) {
      wx.showLoading({
        title: '正在登录中',
      })
      return new Promise((resolve, reject) => {
        wx.request({
          url: that.globalData.urlWechatUsersList,
          method: 'POST',
          data: {
            openid: openid
          },
          header: {
            'content-type': 'application/x-www-form-urlencoded',
            'charset': 'UTF-8'
          },
          success: res => {
            if (res.statusCode === 200) {
              wx.hideLoading()
              console.log('请求用户信息成功:', res.data);
              if (res.data.rows && res.data.rows.length > 0) {
                // 用户存在，使用返回的数据更新
                const userInfo = res.data.rows[0];
                resolve(userInfo);
              } else {
                // 用户不存在，resolve null
                resolve(null);
              }
            } else {
              wx.hideLoading()
              console.error('请求用户信息失败，状态码:', res.statusCode);
              reject(new Error('请求用户信息失败'));
            }
          },
          fail: err => {
            console.error('网络错误:', err);
            reject(new Error('网络错误'));
          },
        });
      });
    }

    // 定义一个请求函数，用于发送网络请求并返回Promise
    function wxRequestPromise(options) {
      return new Promise((resolve, reject) => {
        wx.request({
          ...options,
          success: res => {
            if (res.statusCode === 200) {
              resolve(res.data);
            } else {
              reject(new Error('请求失败，状态码：' + res.statusCode));
            }
          },
          fail: err => {
            reject(new Error('网络请求失败：' + err.errMsg));
          }
        });
      });
    }

    // 保存this到变量that中
    const that = this;
  
    wx.cloud.callFunction({
      name: 'getWXContext',
      success: res => {
        wx.showLoading({
          title: '正在注册中...',
        });
        const {
          openid
        } = res.result.data;
        // openid = 'o795o5Nu3UUl7rN7HiwSfwR4JMqc'
        that.globalData.openid = openid;
        wx.setStorageSync("openid", openid);

        // 调用请求函数，并处理结果
        fetchUserInfo(openid, that)
          .then(userInfo => {
            if (!userInfo) {
              // 用户不存在，自动注册用户的逻辑
              const nickName = 'jkp-' + generateModernCulturalNickname();
              const avatarUrl = 'cloud://tfjkp-0ge80vu9ea710148.7986-tfjkp-0ge80vu9ea710148-1305195523/myjkp/energyPage/avatar10.png';
              const newUserInfo = {
                openid: openid,
                nickname: nickName,
                avatarUrl: avatarUrl,
                weight: 0,
                height: 0,
              };
              // 注册用户的请求逻辑
              return wxRequestPromise({
                  url: that.globalData.urlWechatUserAdd,
                  method: 'POST',
                  data: newUserInfo,
                  header: {
                    'content-type': 'application/x-www-form-urlencoded',
                    'charset': 'UTF-8'
                  },
                })
                .then(() => {
                  // 注册成功后，再次请求fetchUserInfo更新数据
                  return fetchUserInfo(openid, that);
                })
                .then(registeredUserInfo => {
                  if (registeredUserInfo) {
                    console.log('注册用户并重新请求用户信息成功:', registeredUserInfo);
                    // 更新全局数据和本地存储
                    that.globalData.userInfo = registeredUserInfo;
                    wx.setStorageSync("userInfo", registeredUserInfo);
                    console.log('最终更新后的 userInfo:', that.globalData.userInfo);
                    wx.hideLoading()
                    wx.showLoading({
                      title: '注册成功！',
                    })

                    setTimeout(function () {
                      wx.hideLoading()
                    }, 2000)
                  }
                });
            } else {
              // 用户信息已存在，使用第一次请求返回的数据更新
              console.log('用户信息已存在，使用第一次请求返回的数据更新:', userInfo);
              that.globalData.userInfo = userInfo;
              wx.setStorageSync("userInfo", userInfo);
              console.log('最终更新后的 userInfo:', that.globalData.userInfo);
            }
          })
          .catch(error => {
            // 请求失败的处理逻辑
            console.error(error.message);
          });
      },
      fail: err => {
        console.error('获取 OpenID 失败:', err);
      },
    });
    // 登录
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
      }
    })
    // 获取用户信息
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 已经授权，可以直接调用 getUserInfo 获取头像昵称，不会弹框
          wx.getUserInfo({
            success: res => {
              // 可以将 res 发送给后台解码出 unionId
              this.globalData.userInfo = res.userInfo
              // 由于 getUserInfo 是网络请求，可能会在 Page.onLoad 之后才返回
              // 所以此处加入 callback 以防止这种情况
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res)
              }
            }
          })
        }
      }
    })
    // 获取系统状态栏信息
    wx.getSystemInfo({
      success: e => {
        this.globalData.StatusBar = e.statusBarHeight;
        let custom = wx.getMenuButtonBoundingClientRect();
        this.globalData.Custom = custom;
        this.globalData.CustomBar = custom.bottom + custom.top - e.statusBarHeight;
      }
    })
  },


  /**
   * urlPositionList：微信点位列表接口
   * urlTransferListAdd：红包记录添加接口
   * urlPositionList: 'https://jkp.yxqz.top/wechat/position/list',
   * urlTransferListAdd: 'https://jkp.yxqz.top/wechat/transfers/add'
   */

  globalData: {
    userInfo: null,
    openid: 'blog.yxqz.top',
    //微信用户信息
    urlWechatUsersList: 'https://jkp.yxqz.top/wechat/wechatusers/list',
    urlWechatUserAdd: 'https://jkp.yxqz.top/wechat/wechatusers/add',
    urlWechatUserEdit: 'https://jkp.yxqz.top/wechat/wechatusers/edit',
    //点位信息列表
    urlPositionList: 'https://jkp.yxqz.top/wechat/position/list',
    //红包随机转账
    urlTransferListAdd: 'https://jkp.yxqz.top/wechat/transfers/add',
    //点位打卡
    urlWechatClockAdd: 'https://jkp.yxqz.top/wechat/clock/add',
    //运动记录信息
    urlWechatMotionList: 'https://jkp.yxqz.top/wechat/motion/list',
    urlWechatMotionAdd: 'https://jkp.yxqz.top/wechat/motion/add',
    urlWechatMotionEdit: 'https://jkp.yxqz.top/wechat/motion/edit',
    //商品信息列表
    urlProductList: 'https://jkp.yxqz.top/wechat/product/list',
    urlProductEdit: 'https://jkp.yxqz.top/wechat/product/edit',
    //兑换记录列表
    urlRecordsList: 'https://jkp.yxqz.top/wechat/records/list',
    urlRecordsAdd: 'https://jkp.yxqz.top/wechat/records/add',
    urlRecords: 'https://jkp.yxqz.top/wechat/records/records',
  },
})